package 剑指offer;

public class _48不用加减乘除做加法 {

	/*
	 * 写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。
	 */
	//思路:使用位运算
	/*两个数异或：相当于每一位相加，而不考虑进位；
	两个数相与，并左移一位：相当于求得进位；
	将上述两步的结果相加(不进位的结果+进位 = 原结果),最终结果=(相加的结果+0),返回就可以
	*/
	/*
      	二进制计算过程
        5+7 各位相加：101^111=010 进位：101&111=101 (<<1=1010)
        2+10 各位相加：010^1010=1000 进位：010&1010=010 <<1=0100
        8+4 1000^0100=1100 1000&0100=0
        12+0
        
	 */
	public int Add(int a, int b) {
	    return b == 0 ? a : Add(a ^ b, (a & b) << 1);
	}
	public int Add2(int num1, int num2) {
		
		while(num2 !=0) {
			
			int temp =num1 ^ num2;
			num2 = (num1&num2) <<1;
			num1= temp;
		}
		return num1;
	}


	public int Add3(int num1, int num2) {

	  while(num2 !=0){
	  	int temp = num1 ^ num2;
		num2 = (num1 & num2) <<1;
		num1 = temp;
	  }

	  return num1;
	}



}
